#include "stdio.h"

int main() {
    int a[10] = {2, 4, 6, 8, 10, 12, 14, 16, 18, 20};
    int *p1 = &a[0]; //把a[0]元素的地址赋给指针变量p1
    int *p2 = &a;
    int *p3 = a; // 变量 a 存储的就是数组首元素的地址
    printf("数组变量存储就是数组首元素的地址 ：p1=%p,p2=%p,p3 = %p\n", p1, p2, p3);
    // 1. 使用下标遍历数组元素
    for (int i = 0; i < 10; i++)
        printf("%d ", a[i]);
    printf("\n");

    // 2. 使用指针遍历数组元素, a 就是 a[0]的指针
    for (int i = 0; i < 10; i++)
        printf("%d ", *(a + i));
    printf("\n");

    // 3. 使用指针遍历数组元素
    for (int i = 0; i < 10; i++)
        printf("%d ", *(p1 + i));
    printf("\n");

    // 4. 使用指针下标遍历数组元素 p1[i] = a[i] = *(p1 + i) ，此时p1 必须是 a[0]的指针
    for (int i = 0; i < 10; i++)
        printf("%d ", p1[i]);


    // 数组指针 ：当指针变量里存放一个数组的首地址时，此指针变量称为指向数组的指针变量，简称`数组指针`。

    // 指针数组 ：`存放指针的数组`被称为指针数组。


    // 字符数组 vs 字符指针变量
    char str[] = "hello tom";  //使用字符数组
    str[0] = 'i'; //正确
//    str = "hello Tom"; //错误

    char *p4 = "hello tom";
    p4 = "hello tom"; //正确

    // 字符串数组的表示，这些字符串最大长度是6 ，但是存储空间是7，因为存储空间需要存放字符串的结束符\0
    char fruit[][7] = {"Apple", "Orange", "Grape", "Pear", "Peach"};  //上一章5.6节举例4
    // 字符指针数组
    char* weekdays[7] = { "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"};
    char *colors[] = {"red", "yellow", "blue", "white", "black"};

    // 指向固定长度数组的指针变量

    return 0;
}
